package szoftlab4sunak;

import java.util.ArrayList;
import java.util.Random;

public class Dwarf implements Enemy{
	
	Cell currentCell; // az akualis Cell, amin all.
	Init init; // a globalis Init osztaly.
	private int id; //azonosito
	int hp; //eletero
	int speed; //sebesseg
	int ttm; //mikor lephet
	int tempttm; //aktualis cellarol mikor lephet
	Cell previousCell; //elozo cella
	ArrayList<String> op; //fajlba irast segito string tomb
	private int x; // az enemy x koordinataja, rajzolashoz szukseges
	private int y; // az enemy y koordinataja, rajzolashoz szukseges
	private VDwarf vDwarf; // referencia a rajzolast vegzo objektumra
	
	public Dwarf(){

	}
	// az x koordinata erteke
	public int getPosx(){
		return x;
	}
	// az y koordinata erteke
	public int getPosy(){
		return y;
	}
	
	// Konstruktor
	public Dwarf(int id, Cell cell, Init init, ArrayList<String> op) {
		// Megfelelo parameterek beallitasa
		this.op=op;
		this.id = id;
		currentCell = cell;
		previousCell = null;
		this.init = init;
		// tesztelesi celbol hasznalt fuggvenyhivas
		op.add("CE - " + id + " id-val " + currentCell.getID() + " id-u Cell-en letrejott egy HO tipusu Enemy.");
		// tovabbi parameterek megadasa
		ttm = 1;
		tempttm = 1;
		this.x = cell.getPosX();
		this.y = cell.getPosY();
		vDwarf = new VDwarf();
		vDwarf.setEnemy(this);
		init.vmap.vEnemyStore.put(this.id, vDwarf);
		
	}
	
	// Eletero lekerese
	public int getHP() {
		return hp;
	}
    
	// Tick esemenyre reagalas.
	public void Tick() {
		// mehet-e az ellenfel
		if(canIgo()) {
			Cell[] cells = currentCell.getNeighbours();
			// merre mennyen tovabb
			while(true) {
				// random utvonalvalasztashoz szukseges random szam konstrualasa
				Random random = new Random();
				int i = random.nextInt(8);
				// ha vannak szomszedai
				if(cells[i] != null) {
					// ha tudunk lepni
					if(cells[i].isRoad() && cells[i].getID()!=0 && cells[i] != previousCell) {
						// lepes, es az ezzel jaro parameterek beallitasa
						currentCell.moveFrom(this);
						cells[i].moveTo(id, this);
						previousCell = currentCell;
						currentCell = cells[i];
						this.x = currentCell.getPosX();
						this.y = currentCell.getPosY();
						init.vmap.repaint();
						// ha cel cella, vege a jateknak, nyert az Enemy
						if(cells[i].isLastCell())
							init.endGame2();
						return;
					}
				}
			}
		}
		init.vmap.repaint();
	}
	
	// Ha egy Tower meglovi, ezt a metodust hivja meg.
   public void Shoot(Tower t){
    	t.Damage();
    }

   // Ha egy Tower meglovi, ezzel a metoddusal csokkenti az eletet.
   public void Decrease(int amount){
	   // eletero csokkentese
	   	hp -= amount;
	   	// ha meghalt az adott enemy
	   	if(hp <= 0) {
	   		init.map.Update();
	   		currentCell.enemies.remove(this.id);
	   		init.map.enemyStore.remove(this.id);
	   		init.vmap.vEnemyStore.remove(this.id);
	   	}
	   	System.out.println("Eletem: " + this.hp);
   }
    
   // A rajta levo Trap-bol ki tudja szamolni, hogy mehet-e mar tovabb.
   public boolean canIgo() {
	   if(currentCell.getID() != 0) {
		   	if(tempttm == 1) {
		   		tempttm = ttm;
		   		return true;
		   	}
		   	else {
		   		tempttm--;
		   		return false;
		   	}
	   }
	   else {
		   if(speed == 0)
			   return true;
		   else {
			   speed--;
		   }
	   }
	   return false;
   }

// beallitja a parametereit, megadottak alapjan
	public void setParams(int hp, int speed, int ttm) {
		this.hp = hp;
		this.speed = speed;
		this.ttm = ttm;
		this.tempttm = ttm;
	}

	// az ellenfel ketteeseset valositja meg
		public void cutYourSelf() {
			// a "klon" letrehozasa
			int ID = init.getCutID();
			Dwarf h1 = new Dwarf(ID, currentCell, init, op);
			// parametereinek beallitasa
			int newhp = this.hp/2;
			setParams(newhp, speed, tempttm);
			h1.setParams(newhp, this.speed, this.tempttm);
			// tarolas
			init.map.enemyStore.put(ID, h1);
			currentCell.moveTo(ID, h1);
		}

		// trap-re lepeskor varakozasi ido megnovelese
		public void waitTime(int amount) {
			tempttm += amount;
		}

		// ellenfel cellajanak visszaadasa
		public int getPosition() {
			return currentCell.getID();
		}
		
		// visszaadja az Enemy ID-at
		public int getID() {
			return this.id;
		}
}
